
// 预设结构
// const list1 = ['红色', '白色']
// const list2 = ['紫色']
// const list3 = ['黑色', '蓝色', '绿色']
// 理想结构
// const list = [
//   { list1: '红色', list2: '紫色', list3: '黑色' },
//   { list1: '红色', list2: '紫色', list3: '蓝色' },
//   { list1: '红色', list2: '紫色', list3: '绿色' },
//   { list1: '白色', list2: '紫色', list3: '黑色' },
//   { list1: '白色', list2: '紫色', list3: '蓝色' },
//   { list1: '白色', list2: '紫色', list3: '绿色' },
// ]

// 对应key值
const colors = ['color', 'type', 'size']
// 二维数组
const arr = [['红色', '白色'], ['紫色', '粉色'], ['黑色', '蓝色', '绿色']]
// 二维数组最后一个下标
let arrLen = arr.length - 1;

const fn = () => {
  let list = [];
  // 动态指针
  let step = 0;
  // let obj = {}
  // obj 索引key值
  let key = 0;
  let idxs = new Array(arr.length).fill(0);
  // 计算需要循环的次数
  const count = arr.reduce((total, pre) => total * pre.length, 1)
  while (key < count) {

    // 遍历预想的数据结构
    let o = {}
    for (let i in arr) {
      const item = arr[i]
      o = { ...o, [colors[i]]: item[idxs[i]] }
    }
    list.push(o)

    /**
     * 主要业务逻辑
     */

    // 对象索引key累加
    key++;
    // obj = { ...obj, [key]: JSON.parse(JSON.stringify(idxs)) }
    // 末项数据指向最后一项，中间项+1
    if (idxs[arrLen] === arr[arrLen].length - 1) {
      // 中间项指向最后一项，重置
      if (idxs[step + 1] === arr[step + 1].length - 1) {
        idxs[step + 1] = 0
        // 中间项指向最后一项，首项+1
        idxs[0]++
      } else {
        idxs[1]++
      }
    }
    idxs[arrLen] = idxs[arrLen] < arr[arrLen].length - 1 ? ++idxs[arrLen] : 0;
  }
  return list
  // return obj
}

console.log(fn())

// result
// [
//   { color: '红色', type: '紫色', size: '黑色' },
//   { color: '红色', type: '紫色', size: '蓝色' },
//   { color: '红色', type: '紫色', size: '绿色' },
//   { color: '红色', type: '粉色', size: '黑色' },
//   { color: '红色', type: '粉色', size: '蓝色' },
//   { color: '红色', type: '粉色', size: '绿色' },
//   { color: '白色', type: '紫色', size: '黑色' },
//   { color: '白色', type: '紫色', size: '蓝色' },
//   { color: '白色', type: '紫色', size: '绿色' },
//   { color: '白色', type: '粉色', size: '黑色' },
//   { color: '白色', type: '粉色', size: '蓝色' },
//   { color: '白色', type: '粉色', size: '绿色' }
// ]

// *后续还可以扩展，我这边只做了二维数组长度为3的数据
// *这边因同事需求只有长度3，所以暂时结束，后续有兴趣，可以继续深入